<?php
Yii::import('application.modules.user.models.UserStatistics');
Yii::import('application.modules.user.models.Profile');

class User extends CActiveRecord
{
    public $retypePassword, $verifyCode, $login, $userInfo, $dateVisit;
    public static $rolesNames=array(
        'Гость',
        'Пользователь',
        'Модератор',
        'Админ',
    );
    public static $statusNames=array(
        1=>'Жив',
        'Не подверждён',
        'Заблокирован',
        'Приостановлен',
    );

    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function tableName()
    {
        return 'user';
    }

    public function relations()
    {
        return array(
            'profile'=>array(self::HAS_ONE, 'Profile', 'userId'),
            'statistics'=>array(self::HAS_ONE, 'UserStatistics', 'userId'),
        );
    }

    public function rules()
    {
        return array(
            array('id,userName,password,email,verifyCode,role,isActive,lastLoginTime,dateVisit,',
                'required',
                'message'=>'Это поле обязательно для заполнения.',
                'on'=>'login,register,insert,update'),
            array('userName','unique','message'=>'Такое имя пользователя уже зарегистрированно в системе.',
                'on'=>'login,register,insert,update'),
            array('email','unique','message'=>'Такой e-mail уже зарегистрирован в системе.',
                'on'=>'login,register,insert,update'),
            array('userName','match','pattern'=>'/^[0-9a-zA-Z\.\_\-]+$/s',
                'message'=>'Имя пользователя может содержать только буквы латинского алфавита, цифры, знак подчёркивания, тире и точку.',
                'on'=>'login,register,insert,update'),
            array('userName','length','max'=>96,'message'=>'Слишком длинное слово',
                'on'=>'login,register,insert,update'),
            array('confirmCode,dateRegistered','length','max'=>255,'message'=>'Слишком длинное слово',
                'on'=>'login,register,insert,update'),
            array('email','email','message'=>'Введите правильный e-mail',
                'on'=>'login,register,SNLogin,insert,update'),
            array('password','length','min'=>5,'message'=>'Пароль не должен быть короче 5-и символов',
                'on'=>'login,register,insert,update'),
            array('password','match','pattern'=>'/\d+/','message'=>'Пароль должен содержать по крайней мере одну цифру.',
                'on'=>'login,register,insert,update'),
            array('retypePassword','compare','compareAttribute'=>'password','message'=>'Введённые пароли не совпадают.',
                'on'=>'login,register,insert,update'),
            array('verifyCode','captcha','allowEmpty'=>CCaptcha::checkRequirements(),'message'=>'Код проверки не правильный',
                'on'=>'login,register,insert,update'),
            array('id,userName,firstName,lastName,email,confirmCode,dateRegistered,isConfirmed,isActive,isDisplay,statistics','safe',
                'on'=>'search'),
            array('email','required','message'=>'Это поле обязательно для заполнения.',
                'on'=>'SNLogin'),
        );
    }

    public function attributeLabels()
    {
        return array(
            'id'=>'ID',
            'login'=>'Логин (e-mail)',
            'userName'=>'Имя пользователя',
            'password'=>'Пароль',
            'retypePassword'=>'Повторите пароль',
            'email'=>'e-mail',
            'confirmCode'=>'Код подверждения',
            'dateRegistered'=>'Дата регистрации',
            'isConfirmed'=>'Подтверждён',
            'isActive'=>'Статус',
            'isDisplay'=>'Удалён',
            'verifyCode'=>'Введите проверочный код',
            'role'=>'Роль',
            'userRole'=>'Роль',
            'userStatus'=>'Статус',
            'userActivity'=>'Активность',
            'dateVisit'=>'Последний визит',
            'lastVisit'=>'Последний визит',
            'registrationDate'=>'Регистрация',
            'lastLoginTime'=>'Активность',
        );
    }

    public function safeAttributes()
    {
        return array(
            'id',
            'login',
            'userName',
            'email',
            'password',
            'retypePassword',
            'confirmCode',
            'dateRegistered',
            'role'
        );
    }

    public function search()
    {
        $criteria=new CDbCriteria;

        $criteria->compare('id',$this->id,true);
        $criteria->compare('userName',$this->userName,true);
        $criteria->compare('password',$this->password,true);
        $criteria->compare('email',$this->email,true);
        $criteria->compare('confirmCode',$this->confirmCode,true);
        $criteria->compare('dateRegistered',$this->dateRegistered,true);
        $criteria->compare('isConfirmed',$this->isConfirmed);
        $criteria->compare('isActive',$this->isActive);
        $criteria->compare('isDisplay',$this->isDisplay);

        return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
        ));
    }

    public function getUserStatus()
    {
        return self::$statusNames[$this->getStatus()];
    }

    public function getStatus()
    {
        $status=1;
        if(!$this->isConfirmed) $status=2;
        elseif(!$this->isActive) $status=3;
        elseif(!$this->isDisplay) $status=4;

        return $status;
    }

    public function getActivity()
    {
        return (time()-$this->lastLoginTime)<Yii::app()->params['sessionLifeTime'];
    }

    public function getLastVisit()
    {
        return $this->statistics->lastVisit;
    }

    public function getRegistrationDate()
    {
        return Yii::app()->dateFormatter->format('d MMMM yyyy', $this->dateRegistered);
    }

    public function getUserActivity()
    {
        return $this->getActivity() ? 'Онлайн' : 'Оффлайн';
    }

    public function getLastLoginTime()
    {
        return $this->lastLoginTime;
    }

    public function getUserRole()
    {
        return self::$rolesNames[$this->role];
    }

    public function getIsBoy()
    {
        return !$this->profile->sex;
    }

    public function sendConfirmCode()
    {
        $textMessage='Поздравляем с регистрацией!<br />
            Для того, чтобы активировать аккаунт, перейдите по ссылке:<br />'.
            Yii::app()->createAbsoluteUrl('user/register/activation', array('email'=>$this->email,'confirmCode'=>$this->confirmCode));

        Yii::import('ext.yii-mail.YiiMailMessage');
        $message=new YiiMailMessage;
        $message->subject='Регистрация прошла успешно';
        $message->setBody($textMessage, 'text/html');
        $message->addTo($this->email);
        $message->from=Yii::app()->params['adminEmail'];
        if(Yii::app()->mail->send($message)){
            Yii::app()->user->setFlash('userMessage','Регистрация прошла успешно. Для активации аккаунта проверьте почту.');
            return true;
        }

        Yii::app()->user->setFlash('userMessage','Не удалось отправить почту.');
        return false;
    }

    public function sendPassword($password)
    {
        $textMessage='Поздравляем с регистрацией!<br />
            Ваш пароль для входа на сайт:<br />'.$password.'<br />
            Вы можете поменять его на личной странице.';

        Yii::import('ext.yii-mail.YiiMailMessage');
        $message=new YiiMailMessage;
        $message->subject='Регистрация прошла успешно';
        $message->setBody($textMessage, 'text/html');
        $message->addTo($this->email);
        $message->from=Yii::app()->params['adminEmail'];
        if(Yii::app()->mail->send($message)){
            Yii::app()->user->setFlash('userMessage','Пароль для вахода на сайт выслан Вам на эдектронную почту.');
            return true;
        }

        Yii::app()->user->setFlash('userMessage','К сожалению, нам не удалось отправить Вам по почте пароль для входа на сайт. Вы можете установить пароль сейчас
            самостоятельно, или пользоваться для входа своими аккаунтами в других социальных сетях.');
        return false;
    }

    public function getPasswordHash($password,$mail='')
    {
        if(!$mail) $mail=$this->email;
        return md5(Yii::app()->params['salt'].$password.$mail);
    }

    public function getRandomString($length=8)
    {
        $chars='`~!@#$%^&*()-_=+\|/?,.<>[]{};:"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        $numChars=strlen($chars);
        $string='';
        for($i=0; $i<$length; $i++){
            $string.=substr($chars,rand(1,$numChars)-1,1);
        }
        return $string;
    }

    public function getConfirmCodeString($email='')
    {
        if(!$email) $email=$this->email;
        return md5($email.time());
    }

    protected function beforeSave()
    {
        if($this->isNewRecord){
            $this->password=$this->getPasswordHash($this->password,$this->email);
            $this->dateRegistered=time();
        }
        return parent::beforeSave();
    }
}